import random
from django.shortcuts import render
from Washer.views import login_check
from Washer.models import Users
from WashApp.models import Washers
from django.http import HttpResponse, HttpResponseRedirect
from Washer.models import Order


# 制造洗衣机，这个视图做洗衣机设备呈现到前端页面和点击进入到process视图函数
def create(request):
    wmcount = Washers.objects.all()  # 获取当前所有洗衣机设备
    oldcount = {}  # 定义一个空字典
    for c in range(wmcount.count()):  # 遍历当前所有洗衣机
        oldcount[c] = Washers.objects.values('wmid')[c]['wmid']  # 遍历洗衣机的设备id值并添加到创建的字典中
    newcount = {'oldcount': oldcount}  # 定义一个新字典，方便模板使用
    return render(request, 'WashApp/create.html', newcount)


# 加工洗衣机，这个视图往洗衣机表中添加了数据，并重定向到create视图
def process(request):
    num = random.randrange(101010, 989898)  # 调用此方法可随机生成(start,stop)之间的整数
    string1 = stringify(num)  # 调用自定义的stringify()函数，将以上随机生成的数字转换成3个字母加数字的字符串
    string2 = seq_code(string1)  # 调用自定义的seq_code()函数，将以上字符串的顺序打乱
    Washers.objects.create(wmid=string2)  # 在Washers中增加一条记录
    wmcount = Washers.objects.all()  # 获取当前所有洗衣机设备
    oldcount = {}  # 定义一个空字典
    for c in range(wmcount.count()):  # 遍历当前所有洗衣机
        oldcount[c] = Washers.objects.values('wmid')[c]['wmid']  # 遍历洗衣机的设备id值并添加到创建的字典中
    newcount = {'oldcount': oldcount}  # 定义一个新字典，方便模板使用
    return HttpResponseRedirect('/washapp/create')  # 重定向到create视图，使用重定向之后刷新页面不会进入到这个视图函数


# 定义stringify函数，传入一个数字number，返回一个3位字母和数字组合起来的字符串(数字->字符串)
def stringify(number):
    # 声明一个由26个字母组成的列表，并调用random.sample()方法随机抽取3个字母，使其返回一个长度为3的新列表
    letter_list = random.sample(
        ['z', 'y', 'x', 'w', 'v', 'u', 't', 's', 'r', 'q', 'p', 'o', 'n', 'm', 'l', 'k', 'j', 'i', 'h', 'g', 'f', 'e',
         'd', 'c', 'b', 'a'], 3)
    turnstr = ''.join(letter_list)  # 调用join方法，使新的列表转换成一个字符串
    return turnstr + str(number)  # 返回字符串和传入的参数相拼接的新字符串


# 定义seq_code函数，传入一个字符串，返回一个将原字符串打乱的新字符串
def seq_code(string):
    str_list = list(string)  # 将传入的字符串强制类型转换成一个列表
    random.shuffle(str_list)  # 调用random.shuffle()方法打乱列表中元素的顺序
    return ''.join(str_list)  # 调用join()方法使打乱顺序的列表转换成一个字符串


# 首页
@login_check
def index(request):
    return render(request, 'WashApp/index.html')


# 定义一个choose视图，当接收到choose.html中的表单数据时，创建一个与当前用户关联的订单数据
@login_check
def choose(request):
    wmall = Washers.objects.filter(wmstate=False).all()  # 获取Washers数据库中设备状态为0的所有的设备(是一个Queryset对象)，并赋值给一个变量
    oldequipments = {}  # 创建一个空字典，用于接收洗衣机设备的id字段
    for i in range(wmall.count()):  # 遍历Queryset的长度
        ### 向equipments中循环添加数据 ！！！注意这里一定要filter过滤查询所有wmstate为False的，否则会出现查询到的值就
        ### 和以上wmall的值不一一匹配，会出现BUG(执行更新操作时，总会有漏网之鱼o(╥﹏╥)o)
        oldequipments[i] = Washers.objects.filter(wmstate=False).values('wmid')[i]['wmid']
    # 创建一个新字典，用于向前端页面传递上述数据
    newequipments = {'oldequipments': oldequipments}
    if request.method == 'GET':
        return render(request, 'WashApp/choose.html', newequipments)
    elif request.method == 'POST':
        washer_id = request.POST.get('choice')  # 获取当前用户选择的设备id
        user_id = request.session.get('uid')  # 获取当前用户id
        ### 更新wmid为当前设备id的设备状态为True(此为被用户占用状态，不能直接使用)，！！！这里出现BUG，就是
        ### 上面向equipments中添加数据时没有使用filter()，才导致出现更新字段与前端呈现出现了差错o(╥﹏╥)o
        Washers.objects.filter(wmid=washer_id).update(wmstate=True)
        ### 以下方法只能增加一条记录，允许重复的字段却不能重复
        # user = Users.objects.filter(uid=user_id).get()  # 返回一个从用户表中获取的当前用户对象并赋值给user
        # washer = Washers.objects.filter(wmid=washer_id).get()  # 返回一个从洗衣机表中获取的当前设备对象并赋值给washer
        # user.washers.add(washer)  # 创建一个订单--在第三张表u_order中增加一条记录
        ###
        ### 此方法可以重复添加记录，符合设计初衷
        Order.objects.create(user_id=user_id, washer_id=washer_id)  # 创建一个订单--在第三张表u_order中增加一条记录
        # return HttpResponseRedirect('/washapp/choose')  # 重定向到choose视图(测试功能时使用)
        # info = {'washer_id': washer_id, 'user_id': user_id}    # 定义含有设备ID和用户ID的字典，用于render函数向页面传递上下文
        # return render(request, 'WashApp/startwash.html', info)  # 直接跳转到startwash.html页面，并将字典传递给该页面
        return HttpResponseRedirect('/washapp/startwash/' + washer_id + '/' + user_id)


# 开始洗衣，向浏览器地址栏传递一个参数(洗衣机的ID)，方便后期查询订单的时候定向到此页
def startwash(request, washer_id, user_id):
    return render(request, 'WashApp/startwash.html', locals())


# 结束洗衣，在startwash页面点击结束进入到此视图函数
def endwash(request):
    if request.method == 'GET':  # get请求拿页面
        return render(request, 'WashApp/startwash.html')
    if request.method == 'POST':  # post请求处理数据
        washer_id = request.POST.get('washer_id')  # 获取到表单接收的设备id
        Washers.objects.filter(wmid=washer_id).update(wmstate=False)  # 更新该设备的wmstate(状态)的值，此时状态将变成False(可用状态)
        return HttpResponseRedirect('/washapp/index')  # 重定向到洗衣页面
